package com.zhonghan.recharge.listener;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import com.zhonghan.common.wechat.api.TokenApi;
import com.zhonghan.common.wechat.bean.token.Token;
import com.zhonghan.recharge.task.TaskList;

@Component
public class WechatAccessTokenInitialize implements ApplicationListener<ContextRefreshedEvent>{
	
	private Logger logger = Logger.getLogger(this.getClass());

	@Value("${wechat.APPID}")
	private String APPID;
	
	@Value("${wechat.APPSECRET}")
	private String APPSECRET;
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		
		/**
		 * 系统会存在两个容器，一个是root application context ,另一个就是我们自己的 projectName-servlet context（作为root application context的子容器）。
		 * 这种情况下，就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题，我们可以只在root application context初始化完成后调用逻辑代码，
		 * 其他的容器的初始化完成，则不做任何处理，修改后代码
		 */
		if(event.getApplicationContext().getParent() == null){
			//需要执行的逻辑代码，当spring容器初始化完成后就会执行该方法。
			Token token = TokenApi.getToken(APPID, APPSECRET);
			
			String access_token = token.getAccess_token();
			
			TaskList.Wechat_Access_Token = access_token;
			
			logger.info("Spring初始化完成后获取微信接口调用凭证: " + access_token);
			
		}
		
	}

}
